
import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

class Message{
    public String from;
    public String to;
    public String message;
}

@WebServlet("/message")
public class MessageServlet extends HttpServlet {
    // 处理：提交消息的请求
    private ObjectMapper objectMapper = new ObjectMapper();//用于读取请求，并解析
    // 保存信息
    private void save(Message message){
        Connection connection = null;
        PreparedStatement statement = null;
        // 1、和数据库建立连接
        try {
            connection = DButil.getConnection();
            //2、构造SQL语句
            String sql = "insert into message values(?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1,message.from);// 替换第一个？号
            statement.setString(2,message.to);// 替换第二个？号
            statement.setString(3,message.message);// 替换第三个？号
            //3、执行 SQL
            statement.executeUpdate();

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //4、释放资源
            DButil.close(connection,statement,null);
        }
    }
    // 从数据中获取所有的消息
    private List<Message> load(){
        List<Message> messages = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;
        try {
            // 1、和数据库建立连接
            connection = DButil.getConnection();
            //2、构造SQL语句
            String sql = "select * from message";
            statement = connection.prepareStatement(sql);
            //3、执行 SQL
            resultSet = statement.executeQuery();
            //4、遍历结果集
            while(resultSet.next()){
                Message message = new Message();
                message.from = resultSet.getString("from");
                message.to = resultSet.getString("to");
                message.message = resultSet.getString("message");
                messages.add(message);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            //5、释放资源
            DButil.close(connection,statement,resultSet);
        }
        return messages;
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 解析数据
        Message message = objectMapper.readValue(req.getInputStream(),Message.class);
        // 保存数据
        save(message);
        //返回响应：主要是告诉我们的页面。信息是否存入成功。
        // 因为内容比较简单，我们就直接“输出”了。
        resp.setContentType("application/json; charset=utf8");// “指定”（告知浏览器/页面）返回数据的格式 与 读取方式
        // 注意！如果不加上 setContentType 这行代码，浏览器就会把下面返回的数据当做普通的字符串来读取！
        // 我们通过 setContentType 这行代码，告知浏览器数据是一个 json 形式的数据，jQuery的ajax就会将数据转换成json形式
        resp.getWriter().write("{ \"ok\": true }");
    }
    //处理：获取消息列表请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取整个消息列表中的元素，将其全部返回给客户端即可。
        List<Message> messages = load();
        String jsonString = objectMapper.writeValueAsString(messages);
        resp.setContentType("application/json; charset=utf8");//这行代码的用处，就多说了。
        // 将其转化的结果，返回给客户端
        resp.getWriter().write(jsonString);
    }
}
